iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Software Development

離開C#新手村的最後試煉系列 第 7

試煉7 - 學會正確拋例外前,可不能離開新手村

  • 分享至 

  • xImage
  •  

開始試煉

try catch 是控制錯誤很重要的機制
有個新手常發生的問題必須出新手村前要通過試煉
請指出下面程式碼不良的寫法
(怕有人沒看清楚我故意加上一堆這是錯誤示範)

//這是錯誤示範
static void Main(string[] args)
{
    try
    {
        廚房();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    Console.ReadKey();
}
//這是錯誤示範
static void 廚房()
{
    try
    {
        廁所();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
//這是錯誤示範
static void 廁所()
{
    throw new Exception("發現小強!!");
}
//這是錯誤示範

先來看看Log到怎樣的資訊
System.Exception: 發現小強!!
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\code\Yame.Tools\TestConsole\Program.cs: 行 26
有發現問題嗎 並沒有紀錄到錯誤的方法是 廁所()
反而變成 廚房()
這樣寫就是再改變 案發現場 誤導工程師去錯誤的場所打小強
千萬不可以寫 throw ex; 這樣就是把案發現場改到廚房

請這樣寫

static void 廚房()
{
    try
    {
        廁所();
    }
    catch (Exception ex)
    {
        throw;
    }
}

System.Exception: 發現小強!!
於 TestConsole.Program.廁所() 於 G:\TestConsole\Program.cs: 行 47
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\TestConsole\Program.cs: 行 26
這樣就可以正確記錄了

視情況也有一種作法 就是放到InnerException

static void 廚房()
{
    try
    {
        廁所();
    }
    catch (Exception ex)
    {
        throw new Exception("看到小強但找不到",ex);
    }
}

System.Exception: 看到小強但找不到 ---> System.Exception: 發現小強!!
於 TestConsole.Program.廁所() 於 G:\TestConsole\Program.cs: 行 47
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 38
--- 內部例外狀況堆疊追蹤的結尾 ---
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\TestConsole\Program.cs: 行 26

延伸試煉

很完整的例外好文
Exception 怎麼丟才丟得好
Exception 怎麼丟才丟得準
Exception 怎麼接才接得漂亮

Huan-Lin 老師的文章
C# 例外處理(Exception Handling)

結束試煉

例外處理可是很深奧的,這次試煉是基本功請打好基礎


上一篇
試煉6- Console 程式的例外處理
下一篇
試煉8 - 開始練習組合技1 物件導向 + 泛型
系列文
離開C#新手村的最後試煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言